//同以目录下的文件更名：
const fs: object = require("fs");
const path: object = require("path");
const os: object = require("os");
const { addAbortSignal }: { addAbortSignal: object } = require("stream");
const { start }: { start: object } = require("repl");
const { time }: { time: object } = require("console");
export const thisFileName = __filename.replace(__dirname, "").substr(1);//script_把该文件夹下所有文件信息打印出来并且打印该文件夹名字和该文件夹下的文件夹的名字.js

const { basename } = require('path')
const proPath = __dirname // 路径 "/Users/yangxin/code/lib"
// basename(proPath) // 返回结果 lib
// console.log(111111,basename(proPath));//Compressed
// console.log(222222,basename);//[Function: basename]
// console.log(333333,proPath);//C:\Users\Carlos\Downloads\Compressed
export const thisFoldName = basename(proPath)

// 包含当前文件夹所有内容(包含子文件夹和子文件)的数组
let allFiles: string[] = fs.readdirSync(__dirname);
// console.log(allFiles);
// TS完整的函数写法：const add2: 函数类型 = 符合函数类型的值,参考一下：
// const add2: (x: number, y: number) => number = function (x: number, y: number): number { return x + y }
// 匿名函数，最常见的写法： 没有看见=>这个符号而是通过参数小括号后面冒号后面的类型以限制返回值的类型
// const add1 = function (x: number, y: number): number { return x + y }
// 过滤出该数组中所有为文件夹的数组，因为文件夹没有后缀名，以此为筛选条件
// 过滤数组，只留下文件夹的数组 arr一般是allFiles
export const filterOnlyFoldArr = function (arr: string[] = allFiles): string[] {
  let newArr: string[] = []
  for (let i in arr) {
    if (isFoldOrNot(arr[i])) {
      newArr.push(arr[i])
    }
  }
  return newArr
}
// 过滤出该数组中所有为文件的数组，因为文件肯定有后缀名，以此为筛选条件。我这里就把上面的方法取了个反
// 过滤数组，只留下文件夹的数组 arr一般是allFiles。默认参数还是allFiles
export const filterOnlyFileArr = function (arr: string[] = allFiles): string[] {
  let newArr: string[] = []
  for (let i in arr) {
    if (!isFoldOrNot(arr[i])) {
      newArr.push(arr[i])
    }
  }
  return newArr
}
// console.log("只有文件", filterOnlyFileArr());

// 删除或者修改文件内容操作
export const handleDeleteOrWrite = (file: string, content: string = "") => {
  // fs.writeFile(`1此文件夹里面所有文件的名字信息${thisFoldName}.txt`, '', (err) => {
  fs.writeFile(file, content, (err) => {
    if (err) throw err;
    console.log("" + file + '文件已经被清空！');
  })
}


//只删除指定文件里面内容的一部分
export const handleDeleteOrWritePart = (file: string, oldContent: string, newContent: string = "") => {
  fs.readFile(file, (err, data) => {
    if (err) throw err;
    let fileContent: string = data.toString();
    // 只替换一个
    // let modifiedContent = fileContent.replace(oldContent, newContent);
    // 全文替换 全文替换要么递归，要么就用正则表达式里面的/blabla/g  来一把替换掉！
    // let result = data.replace(/old-string/g, 'new-string');
    // const modifiedContent:string = fileContent.replace(`/${oldContent}/g`, newContent);
    /* var replace = "regex";
    var re = new RegExp(replace, "g");
    "mystring".replace(re, "newstring"); */
    // 原来我的写法： 没有达到目标
    // let modifiedContent: string = fileContent.replace(//g, newContent);
    const modifiedContent: string = fileContent.replace(new RegExp(oldContent, "g"), newContent);

    const fs = require('fs');



    fs.writeFile(file, modifiedContent, (err) => {
      if (err) throw err;
      console.log('文件已经被修改！');
    });
  });
}
// return handleDeleteOrWritePart("test.txt", "1", "2")

// 把我要的JS格式的文件全部追加复制到一个新的文件里面。目录，格式，新文件名字
export function appendContentToFile(newFile: string, content: string) {
  fs.appendFileSync(newFile, content);
  console.log(`已经将打印出该文件里所有文件的名字信息到${newFile}中！`);
}

// 更名操作
export function renameFileToNewname(oldName: string, newName: string) {
  fs.rename(oldName, newName, function (err) {
    if (err) {
      throw err;
    }
    // console.log("rename is done!");
  });
}
// 验证结尾后缀是否为真。str文件的名字。appoint文件后缀的名字
function my_validationEnd(str, appoint) {
  // 不区分大小写全部转换成小写。
  str = str.toLowerCase();
  let tempArr = str.split(".");
  let endStr = tempArr[tempArr.length - 1];
  if (appoint === endStr) {
    return true;
  }
  return false;
}
// 过滤数组的方法，返回我想要的文件类型的数组。第一个参数文件数组。第二个参数后缀名，字符串。
export function filterTypeArr(arr, typeStr) {
  let newArr = [];
  for (let i in arr) {
    if (my_validationEnd(arr[i], typeStr)) {
      newArr.push(arr[i]);
    }
  }
  return newArr;
}
// let stat = fs.lstatSync("新建文本文档 (3).txt");
// let stat2 = fs.lstatSync("a");
// console.log(isFoldOrNot('新建文本文档 (3).txt')); //false
// console.log(isFoldOrNot('a')); //true

// 判断是否文件夹
export function isFoldOrNot(fileOrFoldName) {
  return fs.lstatSync(fileOrFoldName).isDirectory();
}

// 获取文件的所有信息
function getFileMsg(file) {
  let msg = fs.statSync(file);
  let size = msg.size / 1024 / 1024;
  var re = /([0-9]+\.[0-9]{1})[0-9]*/;
  let jieQu = size.toString().replace(re, "$1");
  size = jieQu + "MB";
  return {
    name: file,
    size: size,
    atime: msg.atime,
    mtime: msg.mtime,
    ctime: msg.ctime,
    birthtime: msg.birthtime,
  };
}
// getFileMsg('script_ouMeiFilefold文件夹的名字赋给mp4.js')
// console.log('文件大小', getFileMsg('script_ouMeiFilefold文件夹的名字赋给mp4.js'));

// 验证是否是数字 只能判断一位数
function isNum(num) {
  let pattern = /^[0-9]$/;
  /* let str='123'
    let str4='1'
    let str3='9'
    let str2='12a'
    console.log(pattern.test(str));
    console.log(pattern.test(str2));
    console.log(pattern.test(str3));
    console.log(pattern.test(str4)); */
  return pattern.test(num);
}
// 判断是否是小写 一位
function isLow(str) {
  let pattern = /^[a-z]$/;
  /* let str='123'
    let str4='1'
    let str3='9'
    let str2='12a'
    console.log(pattern.test(str));
    console.log(pattern.test(str2));
    console.log(pattern.test(str3));
    console.log(pattern.test(str4)); */
  return pattern.test(str);
}


// 快速排序 递归一定不要用Let，因为一旦除了作用域就失效了。不改变原数组
function my_quick_sort(arr) {
  if (arr.length < 2) return arr;
  let piIndex = Math.floor(arr.length / 2);
  //    拿走中间值
  let pi = arr.splice(piIndex, 1)[0];
  let left = [];
  let right = [];
  for (let i in arr) {
    if (arr[i] < pi) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }
  return my_quick_sort(left).concat(pi, my_quick_sort(right));
}
let testarr: number[] = [1, 2, 2, 1, 5, 4, 0];
// console.log('我的快速',my_quick_sort(testarr));


// console.log('quick', quick_sort(testarr));
// console.log(testarr.splice(0,1),'testarr');//只有一项的数组
//这里的fileType压根就没用到，谁大小最大，就以哪个文件为准


// 加上该文件夹名字的信息！
let msgStr = "此文件夹名字：" + basename(proPath) + os.EOL;
// filterOnlyFileArr
function myFileMsgToTxt(fileType: string = "txt") {
  // 文件夹名字的数组 os.EOL是换行符号 就等于'\n'
  // console.log("只有文件夹",filterOnlyFoldArr());
  filterOnlyFoldArr(allFiles).forEach((foldItem, index) => {
    const foldItemMsg: string = "文件夹：" + foldItem + os.EOL;
    msgStr += foldItemMsg
  })
  // 文件名字的数组 os.EOL是换行符号 就等于'\n'，这里的item可以理解为fileItem
  filterOnlyFileArr(allFiles).forEach((item, index) => {
    if (item == thisFileName) {
      // 跳出本次循环
      return
    }
    const itemMsg: object = getFileMsg(item);
    msgStr += os.EOL + itemMsg.name + os.EOL
    // msgStr += os.EOL + itemMsg.name + os.EOL + itemMsg.size + os.EOL;
    // msgStr += "创建时间：" + itemMsg.birthtime + os.EOL + "修改时间：" + itemMsg.ctime + os.EOL;
  });
  // console.log("文件信息msgStr", msgStr);
  // fold就是每一个文件夹

}
myFileMsgToTxt();




if (allFiles.some((item, index, arr) => {
  return item === `1此文件夹里面所有文件的名字信息${thisFoldName}.txt`
})) {
  handleDeleteOrWrite(`1此文件夹里面所有文件的名字信息${thisFoldName}.txt`, msgStr)
} else {
  // console.log('没有此文件，直接写入！');
  appendContentToFile(`1此文件夹里面所有文件的名字信息${thisFoldName}.txt`, msgStr);
}

